//
// Created by liuhuan on 2021/5/22.
//

#ifndef CPP_OPE_OPE_H
#define CPP_OPE_OPE_H

#include "ValueRange.h"
#include "Coins.h"

using namespace std;

/**
 * 生成一个 保序加密 OPE
 * 可以指定 秘钥，明文域范围，密文域范围，或者使用默认值
 */
class OPE {
private:
    string key;             // 随机生成的秘钥
    ValueRange inRange;     // 明文域 范围
    ValueRange outRange;    // 密文域 范围

public:
    OPE();
    OPE(string key);
    OPE(string key, ValueRange inRange, ValueRange outRange);
    string genRandKey(int length);     // 生成 指定长度 随机秘钥
    uint encrypt(uint plaintext);
    uint encryptRecursive(uint plaintext, ValueRange inRange, ValueRange outRange);

private:    // 这两个是加密过程中调用的两个抽样函数
    uint sampleHgd(ValueRange inRange, ValueRange outRage, uint nSample, Coins coins);
    uint sampleUniform(ValueRange inRange, Coins coins);
};


#endif //CPP_OPE_OPE_H
